; 由于历史原因，需要在进入保护模式之前打开A20地址线，以便可以寻址1M以上的地址空间
; IBM最初推出的8088只有20位地址线，而实模式下，段方式选址最大的寻址空间是0xffff:0xffff=0x10ffef，因此超过1M（0x100000），地址会自动环回到0x0ffef
; 到80286时，地址线是24位，已经可以访问到1M以上的地址空间（老式的8088处理器下，已经有程序利用环回这个特性了，因此需要对环回做兼容），所以想到得是利用一个空闲的端口引脚来控制
; 这个端口引脚就是8042键盘控制器上的P21引脚，对应的端口是P2，这个信号被称作为A20
; 默认情况下，A20是禁止的（也就是0），超过1M的寻址会被清除，环回到0x0ffef，以便兼容8088
; 因此需要使用到1M以上的地址空间，就必须要打开A20信号
; 难题：A20信号跟键盘控制器8042有关，所以对于不同的硬件可能有不同的打开方式
; 有如下种比较普遍的方式打开：直接控制键盘控制器、以及使用A20快速门选项、读0xee端口


; 方法1：直接控制键盘控制器的P2端口，P21引脚
    call empty_8042         ; 检测端口状态是否空闲
	mov	al, 0D1h            ; 写命令
	out 064h, al
	call empty_8042
	mov	al, 0DFh            ; 打开A20
	out	060h,al
	call empty_8042
empty_8042:
	;.word	0x00eb,0x00eb   ; 延时指令，等于jmp $+2
	in al, 064h             ; 8042状态端口
	test al, 2		        ; 检测输入缓冲区是否满
	jnz	empty_8042          ; 缓冲区满，则继续循环等待
	ret


; 方法2：使用A20快速门选项
;   它使用I/O端口0x92
;   缺点：该端口可能被用作其他作用
    in al, 92h
    or al, 00000010b
    out 92h, al

; 方法3：读0xee端口开启A20信号线
;   备注：写0xee端口会禁止A20信号线
    in al, 0eeh